#pragma once

#include <vector>
#include <string.h>

namespace qb{
	namespace ht{
		struct INDEX{
			int				rid, offset;
			INDEX(int r, int o) :rid(r), offset(o){}
		};
		enum kDataType{
			kDataTypeNone = 0,			// 非法值
			kDataTypeDate,				// int 20140107
			kDataTypeFloat,				// float	
			kDataTypeDouble,			// double
			kDataTypeBool,				// bool
			kDataTypeInt,				// int
			kDataTypeInt64,				// _int64
			kDataTypeChar,				// char
			kDataTypeCharArray,			// char[]
			kDataTypeCharPtr,			// char*
			kDataTypeNString,			// unsigned int,CharArray
			kDataTypeTime,				// time_t
			kDataTypeCount				
		};
		enum kUnitType{
			kUnitTypeNone,
			kUnitTypeNumber,
			kUnitTypeIndex,
			kUnitTypeMonIndex,
			kUnitTypePercent,
			kUnitTypeRmbYuan,
			kUnitTypeRmbWanYuan,
			kUnitTypeRmbYiYuan,
			kUnitTypeBp,
			kUnitTypeCount
		};
        const char* GetDataTypeName(kDataType type);
		enum kColumn{};
		//typedef std::string RecordKey;
		typedef int(*FuncColumnComp)(const void* p1, const void* p2);
		typedef char tFieldName[32];
		typedef wchar_t tFieldNameW[32];
		typedef char tFieldDisplayName[64];
		typedef kDataType kColFormatType;
        class ColumnInfo{
			tFieldName				m_field;			// 字段名称
			tFieldNameW				m_fieldw;
			tFieldDisplayName		m_name;			// 中文显示名称
			int						m_namelen;		// 中文显示名称的实际长度
			kDataType				m_data_type;		// 该字段的数据类型
			kUnitType				m_unit_type;		// 该字段的单位类型
			kColFormatType			m_format;		// 该字段的格式化类型,暂时不用
			int						m_bytes;			// 该字段在结构体中的字节大小
			int						m_offset;		// 该字段在结构体中的偏移量
			kColumn					m_id;			// 该字段在表格中的列号(始终不变,这个不是最终显示的列顺序)
			FuncColumnComp			m_comp;			// 该列的排序函数,默认是递增排序
			bool						m_dec;			// 默认为false,表示递增，否则表示递减
			friend class SortBuffer;
			friend class TableSorter;
			friend class TableDesc;
		public:
			ColumnInfo(){ memset(this, 0, sizeof(ColumnInfo)); }
            kColumn GetId()const{ return m_id; }
            int GetFieldBytes()const{ return m_bytes; }
            int GetOffset()const{ return m_offset; }
            kDataType GetDataType()const{ return m_data_type; }
            kColumn GetColumn()const{ return m_id; }
            const char* GetField()const{ return m_field; }
            const wchar_t* GetFieldW()const{ return m_fieldw; }
            const char* GetName()const{ return m_name; }
            int GetNameLen()const{ return m_namelen; }
            void SetSortDecFlag(bool dec){ m_dec = dec; }
            FuncColumnComp GetCompFunc()const{ return m_comp; }
		protected:
			void SetOffset(int offset){ m_offset = offset; }
		};
        class TableDesc{
            std::vector<ColumnInfo>	m_columns;		// 所有列信息
			kColumn					m_keycolumn;		// 该表格的关键列
			kColumn					m_flagcolumn;		// 标志列,类型为bool,1表示删除的列
		public:
			TableDesc();
			int GetColumnCount()const{ return m_columns.size(); }
			kColumn GetKeyColumn()const{ return m_keycolumn; }
			kColumn GetFlagColumn()const{ return m_flagcolumn; }
			void SetKeyColumn(kColumn key){ m_keycolumn = key; }
			void SetFlagColumn(kColumn flag){ 
				m_flagcolumn = flag;
			}
			void AddColumn(const char* field, const char* name, kDataType type, kColFormatType format, int offset, int bytes,
				FuncColumnComp comp = 0, kUnitType unit = kUnitTypeNone);
            const std::vector<ColumnInfo>& GetColumns()const{ return m_columns; }
            const ColumnInfo& GetColumn(int index)
			{
				//SASSERT(index >= 0 && index < (int)m_columns.size());
				return m_columns.at(index);
			}
			int GetRecordSize()const;
		};
		struct ViewInfo{
			int			viewid;
			int			viewsize;
			int			recordsize;
			int			rid_start;
			int			rid_end;
			int			maxviewid;
		};


		class StatUtil{
            unsigned long m_last;
            unsigned long m_gap;
        //    qb::base::HighResTime m_start;
			double		m_sum;
			double		m_lasteach;
			int			m_capture_sum, m_capture_start;
			int			m_count;
			int*		m_capture;
			char		m_name[256];
			char		m_message[256];
		public:
            StatUtil(const char* name, unsigned long reportgap, int* capture = 0);
			void Start(const char* message);
			void End();
		};
		class StatUtilHelper{
			StatUtil*		m_util;
		public:
			StatUtilHelper(StatUtil& util, const char* format, ...);
			~StatUtilHelper(){ m_util->End(); }
		};

#define STAT_HELPER(STAT,fmt,...) StatUtilHelper __localStatHelper(STAT,fmt,__VA_ARGS__)
	}//namespace ht
}//namespace qb
